package san.java.day11;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型通配符: 有限制的通配符
 * 1. <? extends Person> (无穷小, Person]  表示Person类及其子类
 * 2. <? super Person> [Person, 无穷大)  表示Person类及其父类
 * 3. <? extends Comparable> 表示实现了Comparable接口的实现类
 */

public class Wildcards_05 {
    public static void main(String[] args) {

        Dd dd = new Dd();

        List<B1> lb = new ArrayList<B1>();
//        dd.test1(lb);  // test1接收的参数只能是C1及其子类

        List<C1> lc = new ArrayList<C1>();
        dd.test1(lc);
        dd.test2(lc);

        List<D1> ld = new ArrayList<D1>();
        dd.test1(ld);
//        dd.test2(ld);  // test2只接受C1及其父类


    }
}

class Dd {
    /*
        test方法需要一个List集合的参数,但是不确定List里面存的类型是什么
     */
    public void test(List<?> list) {

    }

    /*
    C1及其子类
     */
    public void test1(List<? extends C1> list) {

    }

    /*
       C1及其父类
     */
    public void test2(List<? super C1> list) {

    }

    /*
    接口
     */
    public void test3(List<? extends IA> list) {
        System.out.println("IA接口及其实现类");
    }
}

class A1 {

}

class B1 extends A1{

}

class C1 extends B1 {

}

class D1 extends C1 {

}

interface IA {
    void test();
}

class IAImpl implements IA {

    @Override
    public void test() {

    }
}